🎖️GitЯра🎖️
Node / meshtastic / Meshtastic-Android / files / feature / firmware / src / commonMain / kotlin / org / meshtastic / feature / firmware / FirmwareUpdateScreen.kt
Displaying Raw • Download
feature/firmware/src/commonMain/kotlin/org/meshtastic/feature/firmware/FirmwareUpdateScreen.kt bd2863243bab6eb213401d949839a2bc74dde7e2 (bd286324) Text, 53.04 KB
T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tf0883e@fileTb4b4b4:Te6edf3OptInTb4b4b4(Te6edf3ExperimentalMaterial3ExpressiveApiTff7b72::Te6edf3classTb4b4b4)
Tf0883e@fileTb4b4b4:Te6edf3SuppressTb4b4b4(Ta5d6ff"Ta5d6ffTooManyFunctionsTa5d6ff"Tb4b4b4)
Tff7b72package T7ee787org.meshtastic.feature.firmware
Tff7b72import T7ee787androidx.compose.animation.AnimatedVisibility
Tff7b72import T7ee787androidx.compose.animation.animateContentSize
Tff7b72import T7ee787androidx.compose.foundation.Image
Tff7b72import T7ee787androidx.compose.foundation.layout.Arrangement
Tff7b72import T7ee787androidx.compose.foundation.layout.Arrangement.spacedBy
Tff7b72import T7ee787androidx.compose.foundation.layout.Box
Tff7b72import T7ee787androidx.compose.foundation.layout.Column
Tff7b72import T7ee787androidx.compose.foundation.layout.Row
Tff7b72import T7ee787androidx.compose.foundation.layout.Spacer
Tff7b72import T7ee787androidx.compose.foundation.layout.fillMaxSize
Tff7b72import T7ee787androidx.compose.foundation.layout.fillMaxWidth
Tff7b72import T7ee787androidx.compose.foundation.layout.height
Tff7b72import T7ee787androidx.compose.foundation.layout.padding
Tff7b72import T7ee787androidx.compose.foundation.layout.size
Tff7b72import T7ee787androidx.compose.foundation.layout.width
Tff7b72import T7ee787androidx.compose.foundation.rememberScrollState
Tff7b72import T7ee787androidx.compose.foundation.text.selection.SelectionContainer
Tff7b72import T7ee787androidx.compose.foundation.verticalScroll
Tff7b72import T7ee787androidx.compose.material3.Button
Tff7b72import T7ee787androidx.compose.material3.ButtonDefaults
Tff7b72import T7ee787androidx.compose.material3.Card
Tff7b72import T7ee787androidx.compose.material3.CardDefaults
Tff7b72import T7ee787androidx.compose.material3.CenterAlignedTopAppBar
Tff7b72import T7ee787androidx.compose.material3.CircularWavyProgressIndicator
Tff7b72import T7ee787androidx.compose.material3.ElevatedCard
Tff7b72import T7ee787androidx.compose.material3.ExperimentalMaterial3Api
Tff7b72import T7ee787androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
Tff7b72import T7ee787androidx.compose.material3.Icon
Tff7b72import T7ee787androidx.compose.material3.IconButton
Tff7b72import T7ee787androidx.compose.material3.LinearWavyProgressIndicator
Tff7b72import T7ee787androidx.compose.material3.MaterialTheme
Tff7b72import T7ee787androidx.compose.material3.OutlinedButton
Tff7b72import T7ee787androidx.compose.material3.Scaffold
Tff7b72import T7ee787androidx.compose.material3.SegmentedButton
Tff7b72import T7ee787androidx.compose.material3.SegmentedButtonDefaults
Tff7b72import T7ee787androidx.compose.material3.SingleChoiceSegmentedButtonRow
Tff7b72import T7ee787androidx.compose.material3.Switch
Tff7b72import T7ee787androidx.compose.material3.Text
Tff7b72import T7ee787androidx.compose.material3.TextButton
Tff7b72import T7ee787androidx.compose.runtime.Composable
Tff7b72import T7ee787androidx.compose.runtime.LaunchedEffect
Tff7b72import T7ee787androidx.compose.runtime.getValue
Tff7b72import T7ee787androidx.compose.runtime.mutableIntStateOf
Tff7b72import T7ee787androidx.compose.runtime.mutableStateOf
Tff7b72import T7ee787androidx.compose.runtime.remember
Tff7b72import T7ee787androidx.compose.runtime.saveable.rememberSaveable
Tff7b72import T7ee787androidx.compose.runtime.setValue
Tff7b72import T7ee787androidx.compose.ui.Alignment
Tff7b72import T7ee787androidx.compose.ui.Modifier
Tff7b72import T7ee787androidx.compose.ui.hapticfeedback.HapticFeedbackType
Tff7b72import T7ee787androidx.compose.ui.layout.ContentScale
Tff7b72import T7ee787androidx.compose.ui.platform.LocalHapticFeedback
Tff7b72import T7ee787androidx.compose.ui.text.font.FontFamily
Tff7b72import T7ee787androidx.compose.ui.text.style.TextAlign
Tff7b72import T7ee787androidx.compose.ui.unit.dp
Tff7b72import T7ee787androidx.lifecycle.compose.collectAsStateWithLifecycle
Tff7b72import T7ee787androidx.navigationevent.NavigationEventInfo
Tff7b72import T7ee787androidx.navigationevent.compose.NavigationBackHandler
Tff7b72import T7ee787androidx.navigationevent.compose.rememberNavigationEventState
Tff7b72import T7ee787coil3.compose.AsyncImage
Tff7b72import T7ee787coil3.compose.LocalPlatformContext
Tff7b72import T7ee787coil3.request.ImageRequest
Tff7b72import T7ee787coil3.request.crossfade
Tff7b72import T7ee787com.mikepenz.markdown.m3.Markdown
Tff7b72import T7ee787kotlinx.coroutines.delay
Tff7b72import T7ee787org.jetbrains.compose.resources.painterResource
Tff7b72import T7ee787org.jetbrains.compose.resources.stringResource
Tff7b72import T7ee787org.meshtastic.core.common.util.CommonUri
Tff7b72import T7ee787org.meshtastic.core.database.entity.FirmwareRelease
Tff7b72import T7ee787org.meshtastic.core.database.entity.FirmwareReleaseType
Tff7b72import T7ee787org.meshtastic.core.model.DeviceHardware
Tff7b72import T7ee787org.meshtastic.core.resources.Res
Tff7b72import T7ee787org.meshtastic.core.resources.UiText
Tff7b72import T7ee787org.meshtastic.core.resources.back
Tff7b72import T7ee787org.meshtastic.core.resources.cancel
Tff7b72import T7ee787org.meshtastic.core.resources.chirpy
Tff7b72import T7ee787org.meshtastic.core.resources.dont_show_again_for_device
Tff7b72import T7ee787org.meshtastic.core.resources.firmware_maintenance_select_drive
Tff7b72import T7ee787org.meshtastic.core.resources.firmware_maintenance_upgrade_bootloader_action
Tff7b72import T7ee787org.meshtastic.core.resources.firmware_maintenance_upgrade_confirm_text
Tff7b72import T7ee787org.meshtastic.core.resources.firmware_maintenance_upgrade_confirm_title
Tff7b72import T7ee787org.meshtastic.core.resources.firmware_recovery_button
Tff7b72import T7ee787org.meshtastic.core.resources.firmware_recovery_explanation
Tff7b72import T7ee787org.meshtastic.core.resources.firmware_update_almost_there
Tff7b72import T7ee787org.meshtastic.core.resources.firmware_update_alpha
Tff7b72import T7ee787org.meshtastic.core.resources.firmware_update_checking
Tff7b72import T7ee787org.meshtastic.core.resources.firmware_update_confirm_file_button
Tff7b72import T7ee787org.meshtastic.core.resources.firmware_update_confirm_file_message
Tff7b72import T7ee787org.meshtastic.core.resources.firmware_update_confirm_file_title
Tff7b72import T7ee787org.meshtastic.core.resources.firmware_update_currently_installed
Tff7b72import T7ee787org.meshtastic.core.resources.firmware_update_device
Tff7b72import T7ee787org.meshtastic.core.resources.firmware_update_disclaimer_chirpy_says
Tff7b72import T7ee787org.meshtastic.core.resources.firmware_update_disclaimer_text
Tff7b72import T7ee787org.meshtastic.core.resources.firmware_update_disclaimer_title
Tff7b72import T7ee787org.meshtastic.core.resources.firmware_update_disconnect_warning
Tff7b72import T7ee787org.meshtastic.core.resources.firmware_update_do_not_close
Tff7b72import T7ee787org.meshtastic.core.resources.firmware_update_done
Tff7b72import T7ee787org.meshtastic.core.resources.firmware_update_error
Tff7b72import T7ee787org.meshtastic.core.resources.firmware_update_hang_tight
Tff7b72import T7ee787org.meshtastic.core.resources.firmware_update_keep_device_close
Tff7b72import T7ee787org.meshtastic.core.resources.firmware_update_latest
Tff7b72import T7ee787org.meshtastic.core.resources.firmware_update_local_file
Tff7b72import T7ee787org.meshtastic.core.resources.firmware_update_method_detail
Tff7b72import T7ee787org.meshtastic.core.resources.firmware_update_nightly
Tff7b72import T7ee787org.meshtastic.core.resources.firmware_update_rak4631_bootloader_hint
Tff7b72import T7ee787org.meshtastic.core.resources.firmware_update_release_notes
Tff7b72import T7ee787org.meshtastic.core.resources.firmware_update_retry
Tff7b72import T7ee787org.meshtastic.core.resources.firmware_update_save_dfu_file
Tff7b72import T7ee787org.meshtastic.core.resources.firmware_update_select_file
Tff7b72import T7ee787org.meshtastic.core.resources.firmware_update_slow_bootloader_hint
Tff7b72import T7ee787org.meshtastic.core.resources.firmware_update_source_local
Tff7b72import T7ee787org.meshtastic.core.resources.firmware_update_stable
Tff7b72import T7ee787org.meshtastic.core.resources.firmware_update_success
Tff7b72import T7ee787org.meshtastic.core.resources.firmware_update_success_wiped
Tff7b72import T7ee787org.meshtastic.core.resources.firmware_update_taking_a_while
Tff7b72import T7ee787org.meshtastic.core.resources.firmware_update_target
Tff7b72import T7ee787org.meshtastic.core.resources.firmware_update_title
Tff7b72import T7ee787org.meshtastic.core.resources.firmware_update_unknown_release
Tff7b72import T7ee787org.meshtastic.core.resources.firmware_update_unsupported_transport
Tff7b72import T7ee787org.meshtastic.core.resources.firmware_update_usb_bootloader_warning
Tff7b72import T7ee787org.meshtastic.core.resources.firmware_update_usb_instruction_text
Tff7b72import T7ee787org.meshtastic.core.resources.firmware_update_usb_instruction_title
Tff7b72import T7ee787org.meshtastic.core.resources.firmware_update_verification_failed
Tff7b72import T7ee787org.meshtastic.core.resources.firmware_update_verifying
Tff7b72import T7ee787org.meshtastic.core.resources.firmware_update_waiting_reconnect
Tff7b72import T7ee787org.meshtastic.core.resources.firmware_update_wipe_ble_detail
Tff7b72import T7ee787org.meshtastic.core.resources.firmware_update_wipe_confirm_warning
Tff7b72import T7ee787org.meshtastic.core.resources.firmware_update_wipe_label
Tff7b72import T7ee787org.meshtastic.core.resources.firmware_update_wipe_usb_detail
Tff7b72import T7ee787org.meshtastic.core.resources.i_know_what_i_m_doing
Tff7b72import T7ee787org.meshtastic.core.resources.img_chirpy
Tff7b72import T7ee787org.meshtastic.core.resources.img_hw_unknown
Tff7b72import T7ee787org.meshtastic.core.resources.learn_more
Tff7b72import T7ee787org.meshtastic.core.resources.okay
Tff7b72import T7ee787org.meshtastic.core.resources.save
Tff7b72import T7ee787org.meshtastic.core.ui.component.MeshtasticDialog
Tff7b72import T7ee787org.meshtastic.core.ui.icon.ArrowBack
Tff7b72import T7ee787org.meshtastic.core.ui.icon.Bluetooth
Tff7b72import T7ee787org.meshtastic.core.ui.icon.CheckCircle
Tff7b72import T7ee787org.meshtastic.core.ui.icon.CloudDownload
Tff7b72import T7ee787org.meshtastic.core.ui.icon.Dangerous
Tff7b72import T7ee787org.meshtastic.core.ui.icon.Folder
Tff7b72import T7ee787org.meshtastic.core.ui.icon.MeshtasticIcons
Tff7b72import T7ee787org.meshtastic.core.ui.icon.Refresh
Tff7b72import T7ee787org.meshtastic.core.ui.icon.Usb
Tff7b72import T7ee787org.meshtastic.core.ui.icon.Warning
Tff7b72import T7ee787org.meshtastic.core.ui.icon.Wifi
Tff7b72import T7ee787org.meshtastic.core.ui.util.KeepScreenOn
Tff7b72import T7ee787org.meshtastic.core.ui.util.rememberOpenDocumentTreeLauncher
Tff7b72import T7ee787org.meshtastic.core.ui.util.rememberOpenFileLauncher
Tff7b72import T7ee787org.meshtastic.core.ui.util.rememberOpenUrl
Tff7b72import T7ee787org.meshtastic.core.ui.util.rememberSaveFileLauncher
Tff7b72private Tff7b72const Tff7b72val Te6edf3CYCLE_DELAY_MS Tff7b72= T79c0ff4T79c0ff5T79c0ff0T79c0ff0L
T8b949e/**
* Flashing instructions for the OTAFIX 2.1 bootloader, which lifts the BLE DFU MTU cap (20-byte → 244-byte packets,
* ~10× faster updates). Offered on the Success screen after a low-speed transfer — never mid-upload, where leaving the
* app could drop the DFU link and brick the device.
*/
Tff7b72private Tff7b72const Tff7b72val Te6edf3OTAFIX_BOOTLOADER_URL Tff7b72=
Ta5d6ff"Ta5d6ffhttps://github.com/meshtastic/Adafruit_nRF52_Bootloader_OTAFIX/blob/master/changelog.md#otafix-21Ta5d6ff"
Tf0883e@Composable
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffLongMethodTa5d6ff"Tb4b4b4)
Tff7b72fun Td2a8ffFirmwareUpdateScreenTb4b4b4(Te6edf3onNavigateUpTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4, Te6edf3viewModelTb4b4b4: Te6edf3FirmwareUpdateViewModelTb4b4b4, Te6edf3modifierTb4b4b4: Te6edf3Modifier Tff7b72= Te6edf3ModifierTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3state Tff7b72by Te6edf3viewModelTb4b4b4.Te6edf3stateTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3selectedReleaseType Tff7b72by Te6edf3viewModelTb4b4b4.Te6edf3selectedReleaseTypeTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3deviceHardware Tff7b72by Te6edf3viewModelTb4b4b4.Te6edf3deviceHardwareTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3currentVersion Tff7b72by Te6edf3viewModelTb4b4b4.Te6edf3currentFirmwareVersionTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3selectedRelease Tff7b72by Te6edf3viewModelTb4b4b4.Te6edf3selectedReleaseTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3pendingLocalFirmwareFile Tff7b72by Te6edf3viewModelTb4b4b4.Te6edf3pendingLocalFirmwareFileTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3nightlyUnlocked Tff7b72by Te6edf3viewModelTb4b4b4.Te6edf3nightlyUnlockedTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72var Te6edf3showExitConfirmation Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3mutableStateOfTb4b4b4(Tff7b72falseTb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3filePickerLauncher Tff7b72= Te6edf3rememberOpenFileLauncher Tb4b4b4{ Te6edf3uriTb4b4b4: Te6edf3CommonUri? Tff7b72-Tff7b72>
Te6edf3uriTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3viewModelTb4b4b4.Te6edf3prepareLocalFirmwareFileTb4b4b4(Tffa657itTb4b4b4) Tb4b4b4}
Tb4b4b4}
Tff7b72val Te6edf3saveFileLauncher Tff7b72= Te6edf3rememberSaveFileLauncher Tb4b4b4{ Te6edf3uri Tff7b72-Tff7b72> Te6edf3viewModelTb4b4b4.Te6edf3saveDfuFileTb4b4b4(Te6edf3uriTb4b4b4) Tb4b4b4}
T8b949e// Maintenance passes pick the whole volume, not a filename, so the app can read INFO_UF2.TXT and confirm it really
T8b949e// is the device's update drive before writing anything to it.
Tff7b72val Te6edf3volumePickerLauncher Tff7b72= Te6edf3rememberOpenDocumentTreeLauncher Tb4b4b4{ Te6edf3uri Tff7b72-Tff7b72>
Te6edf3uriTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3viewModelTb4b4b4.Te6edf3writeMaintenancePassTb4b4b4(Tffa657itTb4b4b4) Tb4b4b4}
Tb4b4b4}
Tff7b72val Te6edf3actions Tff7b72=
Te6edf3rememberTb4b4b4(Te6edf3viewModelTb4b4b4, Te6edf3onNavigateUpTb4b4b4) Tb4b4b4{
Te6edf3FirmwareUpdateActionsTb4b4b4(
Te6edf3onReleaseTypeSelect Tff7b72= Te6edf3viewModelTff7b72::Te6edf3setReleaseTypeTb4b4b4,
Te6edf3onStartUpdate Tff7b72= Te6edf3viewModelTff7b72::Te6edf3startUpdateTb4b4b4,
Te6edf3onPickFile Tff7b72= Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3state Tff7b72is Te6edf3FirmwareUpdateStateTb4b4b4.Te6edf3ReadyTb4b4b4) Tb4b4b4{
Te6edf3filePickerLauncherTb4b4b4(Ta5d6ff"Ta5d6ff*/*Ta5d6ff"Tb4b4b4)
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3onSaveFile Tff7b72= Tb4b4b4{ Te6edf3fileName Tff7b72-Tff7b72> Te6edf3saveFileLauncherTb4b4b4(Te6edf3fileNameTb4b4b4, Te6edf3UF2_MIME_TYPETb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3onPickVolume Tff7b72= Te6edf3volumePickerLauncherTb4b4b4,
Te6edf3onBootloaderUpgrade Tff7b72= Te6edf3viewModelTff7b72::Te6edf3startBootloaderUpgradeTb4b4b4,
Te6edf3onConfirmLocalFile Tff7b72= Te6edf3viewModelTff7b72::Te6edf3confirmLocalFirmwareFileTb4b4b4,
Te6edf3onDismissLocalFile Tff7b72= Te6edf3viewModelTff7b72::Te6edf3dismissLocalFirmwareFileTb4b4b4,
Te6edf3onRetry Tff7b72= Te6edf3viewModelTff7b72::Te6edf3checkForUpdatesTb4b4b4,
Te6edf3onCancel Tff7b72= Tb4b4b4{ Te6edf3showExitConfirmation Tff7b72= Tff7b72true Tb4b4b4}Tb4b4b4,
Te6edf3onDone Tff7b72= Tb4b4b4{ Te6edf3onNavigateUpTb4b4b4(Tb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3onDismissBootloaderWarning Tff7b72= Te6edf3viewModelTff7b72::Te6edf3dismissBootloaderWarningForCurrentDeviceTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Te6edf3KeepScreenOnTb4b4b4(Te6edf3shouldKeepFirmwareScreenOnTb4b4b4(Te6edf3stateTb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3backHandlerState Tff7b72= Te6edf3rememberNavigationEventStateTb4b4b4(Te6edf3NavigationEventInfoTb4b4b4.Te6edf3NoneTb4b4b4)
Te6edf3NavigationBackHandlerTb4b4b4(
Te6edf3state Tff7b72= Te6edf3backHandlerStateTb4b4b4,
Te6edf3isBackEnabled Tff7b72= Te6edf3shouldKeepFirmwareScreenOnTb4b4b4(Te6edf3stateTb4b4b4)Tb4b4b4,
Te6edf3onBackCompleted Tff7b72= Tb4b4b4{ Te6edf3showExitConfirmation Tff7b72= Tff7b72true Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3showExitConfirmationTb4b4b4) Tb4b4b4{
Te6edf3MeshtasticDialogTb4b4b4(
Te6edf3onDismiss Tff7b72= Tb4b4b4{ Te6edf3showExitConfirmation Tff7b72= Tff7b72false Tb4b4b4}Tb4b4b4,
Te6edf3title Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_update_disclaimer_titleTb4b4b4)Tb4b4b4,
Te6edf3message Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_update_disconnect_warningTb4b4b4)Tb4b4b4,
Te6edf3confirmText Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_update_retryTb4b4b4)Tb4b4b4,
Te6edf3onConfirm Tff7b72= Tb4b4b4{
Te6edf3showExitConfirmation Tff7b72= Tff7b72false
Te6edf3viewModelTb4b4b4.Te6edf3cancelUpdateTb4b4b4(Tb4b4b4)
Te6edf3onNavigateUpTb4b4b4(Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3dismissText Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3backTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Te6edf3pendingLocalFirmwareFileTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3pendingFile Tff7b72-Tff7b72>
Te6edf3LocalFirmwareFileConfirmationDialogTb4b4b4(
Te6edf3pendingFile Tff7b72= Te6edf3pendingFileTb4b4b4,
Te6edf3onConfirm Tff7b72= Te6edf3actionsTb4b4b4.Te6edf3onConfirmLocalFileTb4b4b4,
Te6edf3onDismiss Tff7b72= Te6edf3actionsTb4b4b4.Te6edf3onDismissLocalFileTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Te6edf3FirmwareUpdateScaffoldTb4b4b4(
Te6edf3modifier Tff7b72= Te6edf3modifierTb4b4b4,
Te6edf3onNavigateUp Tff7b72= Te6edf3onNavigateUpTb4b4b4,
Te6edf3state Tff7b72= Te6edf3stateTb4b4b4,
Te6edf3selectedReleaseType Tff7b72= Te6edf3selectedReleaseTypeTb4b4b4,
Te6edf3showNightly Tff7b72= Te6edf3nightlyUnlockedTb4b4b4,
Te6edf3actions Tff7b72= Te6edf3actionsTb4b4b4,
Te6edf3deviceHardware Tff7b72= Te6edf3deviceHardwareTb4b4b4,
Te6edf3currentVersion Tff7b72= Te6edf3currentVersionTb4b4b4,
Te6edf3selectedRelease Tff7b72= Te6edf3selectedReleaseTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffLocalFirmwareFileConfirmationDialogTb4b4b4(
Te6edf3pendingFileTb4b4b4: Te6edf3PendingLocalFirmwareFileTb4b4b4,
Te6edf3onConfirmTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3onDismissTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3MeshtasticDialogTb4b4b4(
Te6edf3onDismiss Tff7b72= Te6edf3onDismissTb4b4b4,
Te6edf3title Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_update_confirm_file_titleTb4b4b4)Tb4b4b4,
Te6edf3confirmText Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_update_confirm_file_buttonTb4b4b4)Tb4b4b4,
Te6edf3onConfirm Tff7b72= Te6edf3onConfirmTb4b4b4,
Te6edf3dismissText Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3cancelTb4b4b4)Tb4b4b4,
Te6edf3text Tff7b72= Tb4b4b4{
Te6edf3ColumnTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_update_confirm_file_messageTb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3bodyMediumTb4b4b4,
Tb4b4b4)
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff1T79c0ff2.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3SelectionContainer Tb4b4b4{
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3pendingFileTb4b4b4.Te6edf3fileNameTb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3bodyMediumTb4b4b4,
Te6edf3fontFamily Tff7b72= Te6edf3FontFamilyTb4b4b4.Te6edf3MonospaceTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff1T79c0ff2.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_update_deviceTb4b4b4, Te6edf3pendingFileTb4b4b4.Te6edf3deviceNameTb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3bodySmallTb4b4b4,
Te6edf3color Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3onSurfaceVariantTb4b4b4,
Tb4b4b4)
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_update_targetTb4b4b4, Te6edf3pendingFileTb4b4b4.Te6edf3platformioTargetTb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3bodySmallTb4b4b4,
Te6edf3color Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3onSurfaceVariantTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tf0883e@OptInTb4b4b4(Te6edf3ExperimentalMaterial3ApiTff7b72::Te6edf3classTb4b4b4)
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffFirmwareUpdateScaffoldTb4b4b4(
Te6edf3onNavigateUpTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3stateTb4b4b4: Te6edf3FirmwareUpdateStateTb4b4b4,
Te6edf3selectedReleaseTypeTb4b4b4: Te6edf3FirmwareReleaseTypeTb4b4b4,
Te6edf3showNightlyTb4b4b4: Tffa657BooleanTb4b4b4,
Te6edf3actionsTb4b4b4: Te6edf3FirmwareUpdateActionsTb4b4b4,
Te6edf3deviceHardwareTb4b4b4: Te6edf3DeviceHardware?Tb4b4b4,
Te6edf3currentVersionTb4b4b4: Tffa657String?Tb4b4b4,
Te6edf3selectedReleaseTb4b4b4: Te6edf3FirmwareRelease?Tb4b4b4,
Te6edf3modifierTb4b4b4: Te6edf3Modifier Tff7b72= Te6edf3ModifierTb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3ScaffoldTb4b4b4(
Te6edf3modifier Tff7b72= Te6edf3modifierTb4b4b4,
Te6edf3topBar Tff7b72= Tb4b4b4{
Te6edf3CenterAlignedTopAppBarTb4b4b4(
Te6edf3title Tff7b72= Tb4b4b4{ Te6edf3TextTb4b4b4(Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_update_titleTb4b4b4)Tb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3navigationIcon Tff7b72= Tb4b4b4{
Te6edf3IconButtonTb4b4b4(Te6edf3onClick Tff7b72= Tb4b4b4{ Te6edf3onNavigateUpTb4b4b4(Tb4b4b4) Tb4b4b4}Tb4b4b4) Tb4b4b4{
Te6edf3IconTb4b4b4(Te6edf3MeshtasticIconsTb4b4b4.Te6edf3ArrowBackTb4b4b4, Te6edf3contentDescription Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3backTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Tb4b4b4) Tb4b4b4{ Te6edf3padding Tff7b72-Tff7b72>
Te6edf3ColumnTb4b4b4(
Te6edf3modifier Tff7b72=
Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3paddingTb4b4b4)
Tb4b4b4.Te6edf3fillMaxSizeTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3verticalScrollTb4b4b4(Te6edf3rememberScrollStateTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3horizontal Tff7b72= T79c0ff2T79c0ff4.Te6edf3dpTb4b4b4)
Tb4b4b4.Te6edf3animateContentSizeTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3horizontalAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterHorizontallyTb4b4b4,
Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3deviceHardware Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4)
T8b949e// Recovery flashes the stored channel's current release, so the channel picker would mislead.
Tff7b72val Te6edf3showReleaseSelector Tff7b72=
Tb4b4b4(
Te6edf3state Tff7b72is Te6edf3FirmwareUpdateStateTb4b4b4.Te6edf3Ready Tff7b72|Tff7b72|
Te6edf3state Tff7b72is Te6edf3FirmwareUpdateStateTb4b4b4.Te6edf3Idle Tff7b72|Tff7b72|
Te6edf3state Tff7b72is Te6edf3FirmwareUpdateStateTb4b4b4.Te6edf3Checking
Tb4b4b4) Tff7b72&Tff7b72&
Tb4b4b4(Te6edf3state Tff7b72as? Te6edf3FirmwareUpdateStateTb4b4b4.Te6edf3ReadyTb4b4b4)Tff7b72?.Te6edf3isRecovery Tff7b72!Tff7b72= Tff7b72true
Te6edf3AnimatedVisibilityTb4b4b4(Te6edf3visible Tff7b72= Te6edf3showReleaseSelectorTb4b4b4) Tb4b4b4{
Te6edf3Column Tb4b4b4{
Te6edf3ReleaseTypeSelectorTb4b4b4(Te6edf3selectedReleaseTypeTb4b4b4, Te6edf3showNightlyTb4b4b4, Te6edf3actionsTb4b4b4.Te6edf3onReleaseTypeSelectTb4b4b4)
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Te6edf3DeviceInfoCardTb4b4b4(
Te6edf3deviceHardware Tff7b72= Te6edf3deviceHardwareTb4b4b4,
Te6edf3release Tff7b72= Te6edf3selectedReleaseTb4b4b4,
Te6edf3currentFirmwareVersion Tff7b72= Te6edf3currentVersionTb4b4b4,
Te6edf3selectedReleaseType Tff7b72= Te6edf3selectedReleaseTypeTb4b4b4,
Tb4b4b4)
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4)
Tb4b4b4}
Te6edf3BoxTb4b4b4(Te6edf3contentAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3TopCenterTb4b4b4) Tb4b4b4{
Te6edf3FirmwareUpdateContentTb4b4b4(Te6edf3state Tff7b72= Te6edf3stateTb4b4b4, Te6edf3selectedReleaseType Tff7b72= Te6edf3selectedReleaseTypeTb4b4b4, Te6edf3actions Tff7b72= Te6edf3actionsTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tff7b72private Tff7b72fun Td2a8ffshouldKeepFirmwareScreenOnTb4b4b4(Te6edf3stateTb4b4b4: Te6edf3FirmwareUpdateStateTb4b4b4)Tb4b4b4: Tffa657Boolean Tff7b72= Tff7b72when Tb4b4b4(Te6edf3stateTb4b4b4) Tb4b4b4{
Tff7b72is Te6edf3FirmwareUpdateStateTb4b4b4.Te6edf3DownloadingTb4b4b4,
Tff7b72is Te6edf3FirmwareUpdateStateTb4b4b4.Te6edf3ProcessingTb4b4b4,
Tff7b72is Te6edf3FirmwareUpdateStateTb4b4b4.Te6edf3UpdatingTb4b4b4,
Tff7b72is Te6edf3FirmwareUpdateStateTb4b4b4.Te6edf3VerifyingTb4b4b4,
Tff7b72-Tff7b72> Tff7b72true
T8b949e// A maintenance pass is mid-sequence: the device may already have no application, and the pass queue lives in
T8b949e// the
T8b949e// ViewModel, so letting the screen sleep (and the ViewModel clear) would strand the device.
Tff7b72is Te6edf3FirmwareUpdateStateTb4b4b4.Te6edf3AwaitingFileSave Tff7b72-Tff7b72> Te6edf3stateTb4b4b4.Te6edf3stepTb4b4b4.Te6edf3isDestructive Tff7b72|Tff7b72| Te6edf3stateTb4b4b4.Te6edf3retryMessage Tff7b72!Tff7b72= Tff7b72null
Tff7b72else Tff7b72-Tff7b72> Tff7b72false
Tb4b4b4}
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffFirmwareUpdateContentTb4b4b4(
Te6edf3stateTb4b4b4: Te6edf3FirmwareUpdateStateTb4b4b4,
Te6edf3selectedReleaseTypeTb4b4b4: Te6edf3FirmwareReleaseTypeTb4b4b4,
Te6edf3actionsTb4b4b4: Te6edf3FirmwareUpdateActionsTb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3ColumnTb4b4b4(
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3horizontalAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterHorizontallyTb4b4b4,
Te6edf3verticalArrangement Tff7b72= Te6edf3ArrangementTb4b4b4.Te6edf3TopTb4b4b4,
Tb4b4b4) Tb4b4b4{
Tff7b72when Tb4b4b4(Te6edf3stateTb4b4b4) Tb4b4b4{
Tff7b72is Te6edf3FirmwareUpdateStateTb4b4b4.Te6edf3IdleTb4b4b4,
Te6edf3FirmwareUpdateStateTb4b4b4.Te6edf3CheckingTb4b4b4,
Tff7b72-Tff7b72> Te6edf3CheckingStateTb4b4b4(Tb4b4b4)
Tff7b72is Te6edf3FirmwareUpdateStateTb4b4b4.Te6edf3Ready Tff7b72-Tff7b72>
Te6edf3ReadyStateTb4b4b4(Te6edf3state Tff7b72= Te6edf3stateTb4b4b4, Te6edf3selectedReleaseType Tff7b72= Te6edf3selectedReleaseTypeTb4b4b4, Te6edf3actions Tff7b72= Te6edf3actionsTb4b4b4)
Tff7b72is Te6edf3FirmwareUpdateStateTb4b4b4.Te6edf3Downloading Tff7b72-Tff7b72>
Te6edf3ProgressContentTb4b4b4(Te6edf3stateTb4b4b4.Te6edf3progressStateTb4b4b4, Te6edf3onCancel Tff7b72= Te6edf3actionsTb4b4b4.Te6edf3onCancelTb4b4b4, Te6edf3isDownloading Tff7b72= Tff7b72trueTb4b4b4)
Tff7b72is Te6edf3FirmwareUpdateStateTb4b4b4.Te6edf3Processing Tff7b72-Tff7b72> Te6edf3ProgressContentTb4b4b4(Te6edf3stateTb4b4b4.Te6edf3progressStateTb4b4b4, Te6edf3onCancel Tff7b72= Te6edf3actionsTb4b4b4.Te6edf3onCancelTb4b4b4)
Tff7b72is Te6edf3FirmwareUpdateStateTb4b4b4.Te6edf3Updating Tff7b72-Tff7b72>
Te6edf3ProgressContentTb4b4b4(Te6edf3stateTb4b4b4.Te6edf3progressStateTb4b4b4, Te6edf3onCancel Tff7b72= Te6edf3actionsTb4b4b4.Te6edf3onCancelTb4b4b4, Te6edf3isUpdating Tff7b72= Tff7b72trueTb4b4b4)
Tff7b72is Te6edf3FirmwareUpdateStateTb4b4b4.Te6edf3Verifying Tff7b72-Tff7b72> Te6edf3VerifyingStateTb4b4b4(Tb4b4b4)
Tff7b72is Te6edf3FirmwareUpdateStateTb4b4b4.Te6edf3VerificationFailed Tff7b72-Tff7b72>
Te6edf3VerificationFailedStateTb4b4b4(Te6edf3onRetry Tff7b72= Tb4b4b4{ Te6edf3actionsTb4b4b4.Te6edf3onStartUpdateTb4b4b4(Tff7b72falseTb4b4b4) Tb4b4b4}Tb4b4b4, Te6edf3onIgnore Tff7b72= Te6edf3actionsTb4b4b4.Te6edf3onDoneTb4b4b4)
Tff7b72is Te6edf3FirmwareUpdateStateTb4b4b4.Te6edf3Error Tff7b72-Tff7b72> Te6edf3ErrorStateTb4b4b4(Te6edf3error Tff7b72= Te6edf3stateTb4b4b4.Te6edf3errorTb4b4b4, Te6edf3onRetry Tff7b72= Te6edf3actionsTb4b4b4.Te6edf3onRetryTb4b4b4)
Tff7b72is Te6edf3FirmwareUpdateStateTb4b4b4.Te6edf3Success Tff7b72-Tff7b72>
Te6edf3SuccessStateTb4b4b4(
Te6edf3onDone Tff7b72= Te6edf3actionsTb4b4b4.Te6edf3onDoneTb4b4b4,
Te6edf3wasLowSpeedTransfer Tff7b72= Te6edf3stateTb4b4b4.Te6edf3wasLowSpeedTransferTb4b4b4,
Te6edf3deviceWasWiped Tff7b72= Te6edf3stateTb4b4b4.Te6edf3deviceWasWipedTb4b4b4,
Tb4b4b4)
Tff7b72is Te6edf3FirmwareUpdateStateTb4b4b4.Te6edf3AwaitingFileSave Tff7b72-Tff7b72>
Te6edf3AwaitingFileSaveStateTb4b4b4(
Te6edf3state Tff7b72= Te6edf3stateTb4b4b4,
Te6edf3onSaveFile Tff7b72= Te6edf3actionsTb4b4b4.Te6edf3onSaveFileTb4b4b4,
Te6edf3onPickVolume Tff7b72= Te6edf3actionsTb4b4b4.Te6edf3onPickVolumeTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tf0883e@Composable
Tff7b72internal Tff7b72fun Td2a8ffVerifyingStateTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3CircularWavyProgressIndicatorTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3sizeTb4b4b4(T79c0ff6T79c0ff4.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff2T79c0ff4.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3TextTb4b4b4(Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_update_verifyingTb4b4b4)Tb4b4b4, Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3titleMediumTb4b4b4)
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3TextTb4b4b4(
Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_update_waiting_reconnectTb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3bodyMediumTb4b4b4,
Te6edf3color Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3onSurfaceVariantTb4b4b4,
Tb4b4b4)
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3CyclingMessagesTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tf0883e@Composable
Tff7b72internal Tff7b72fun Td2a8ffCheckingStateTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3CircularWavyProgressIndicatorTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3sizeTb4b4b4(T79c0ff6T79c0ff4.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff2T79c0ff4.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3TextTb4b4b4(Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_update_checkingTb4b4b4)Tb4b4b4, Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3bodyLargeTb4b4b4)
Tb4b4b4}
Tf0883e@Composable
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffLongMethodTa5d6ff"Tb4b4b4)
Tff7b72private Tff7b72fun Td2a8ffReadyStateTb4b4b4(
Te6edf3stateTb4b4b4: Te6edf3FirmwareUpdateStateTb4b4b4.Te6edf3ReadyTb4b4b4,
Te6edf3selectedReleaseTypeTb4b4b4: Te6edf3FirmwareReleaseTypeTb4b4b4,
Te6edf3actionsTb4b4b4: Te6edf3FirmwareUpdateActionsTb4b4b4,
Tb4b4b4) Tb4b4b4{
T8b949e// Unknown == no update path for this transport+device combo (e.g. ESP32 over Serial, nRF52 over TCP). Say so
T8b949e// up front instead of offering a button whose handler would only throw on press.
Tff7b72if Tb4b4b4(Te6edf3stateTb4b4b4.Te6edf3updateMethod Tff7b72is Te6edf3FirmwareUpdateMethodTb4b4b4.Te6edf3UnknownTb4b4b4) Tb4b4b4{
Te6edf3UnsupportedTransportStateTb4b4b4(Tb4b4b4)
Tff7b72return
Tb4b4b4}
Tff7b72var Te6edf3showDisclaimer Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3mutableStateOfTb4b4b4(Tff7b72falseTb4b4b4) Tb4b4b4}
T8b949e// Deliberately not persisted anywhere: the wipe is an explicit per-update opt-in, never sticky.
Tff7b72var Te6edf3wipeDevice Tff7b72by Te6edf3rememberSaveable Tb4b4b4{ Te6edf3mutableStateOfTb4b4b4(Tff7b72falseTb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3device Tff7b72= Te6edf3stateTb4b4b4.Te6edf3deviceHardware
Tff7b72val Te6edf3haptic Tff7b72= Te6edf3LocalHapticFeedbackTb4b4b4.Te6edf3current
Tff7b72val Te6edf3wipeOffer Tff7b72= Te6edf3wipeOfferTb4b4b4(Te6edf3stateTb4b4b4, Te6edf3selectedReleaseTypeTb4b4b4)
Tff7b72val Te6edf3wipeArmed Tff7b72= Te6edf3wipeOfferTb4b4b4.Te6edf3offered Tff7b72&Tff7b72& Te6edf3wipeDevice Tff7b72&Tff7b72& Te6edf3wipeOfferTb4b4b4.Te6edf3refusal Tff7b72=Tff7b72= Tff7b72null
Tff7b72if Tb4b4b4(Te6edf3showDisclaimerTb4b4b4) Tb4b4b4{
Te6edf3DisclaimerDialogTb4b4b4(
Te6edf3updateMethod Tff7b72= Te6edf3stateTb4b4b4.Te6edf3updateMethodTb4b4b4,
Te6edf3wipeDevice Tff7b72= Te6edf3wipeArmedTb4b4b4,
Te6edf3onDismiss Tff7b72= Tb4b4b4{ Te6edf3showDisclaimer Tff7b72= Tff7b72false Tb4b4b4}Tb4b4b4,
Te6edf3onConfirm Tff7b72= Tb4b4b4{
Te6edf3showDisclaimer Tff7b72= Tff7b72false
Tff7b72if Tb4b4b4(Te6edf3selectedReleaseType Tff7b72=Tff7b72= Te6edf3FirmwareReleaseTypeTb4b4b4.Te6edf3LOCALTb4b4b4) Tb4b4b4{
Te6edf3actionsTb4b4b4.Te6edf3onPickFileTb4b4b4(Tb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3actionsTb4b4b4.Te6edf3onStartUpdateTb4b4b4(Te6edf3wipeArmedTb4b4b4)
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3stateTb4b4b4.Te6edf3showBootloaderWarningTb4b4b4) Tb4b4b4{
Te6edf3BootloaderWarningCardTb4b4b4(Te6edf3deviceHardware Tff7b72= Te6edf3deviceTb4b4b4, Te6edf3onDismissForDevice Tff7b72= Te6edf3actionsTb4b4b4.Te6edf3onDismissBootloaderWarningTb4b4b4)
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3stateTb4b4b4.Te6edf3maintenanceTb4b4b4.Te6edf3showBootloaderUpgradeTb4b4b4) Tb4b4b4{
Te6edf3UsbMaintenanceCardTb4b4b4(Te6edf3deviceName Tff7b72= Te6edf3deviceTb4b4b4.Te6edf3displayNameTb4b4b4, Te6edf3onBootloaderUpgrade Tff7b72= Te6edf3actionsTb4b4b4.Te6edf3onBootloaderUpgradeTb4b4b4)
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3wipeOfferTb4b4b4.Te6edf3offeredTb4b4b4) Tb4b4b4{
Te6edf3WipeDeviceToggleTb4b4b4(
Te6edf3updateMethod Tff7b72= Te6edf3stateTb4b4b4.Te6edf3updateMethodTb4b4b4,
Te6edf3refusal Tff7b72= Te6edf3wipeOfferTb4b4b4.Te6edf3refusalTb4b4b4,
Te6edf3wipeDevice Tff7b72= Te6edf3wipeDeviceTb4b4b4,
Te6edf3onWipeDeviceChange Tff7b72= Tb4b4b4{ Te6edf3wipeDevice Tff7b72= Tffa657it Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3stateTb4b4b4.Te6edf3isRecoveryTb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_recovery_explanationTb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3bodyMediumTb4b4b4,
Te6edf3color Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3onSurfaceVariantTb4b4b4,
Te6edf3textAlign Tff7b72= Te6edf3TextAlignTb4b4b4.Te6edf3CenterTb4b4b4,
Tb4b4b4)
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4)
Tb4b4b4}
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3ReadyActionButtonTb4b4b4(Te6edf3stateTb4b4b4, Te6edf3selectedReleaseTypeTb4b4b4) Tb4b4b4{
Te6edf3hapticTb4b4b4.Te6edf3performHapticFeedbackTb4b4b4(Te6edf3HapticFeedbackTypeTb4b4b4.Te6edf3LongPressTb4b4b4)
Te6edf3showDisclaimer Tff7b72= Tff7b72true
Tb4b4b4}
Tb4b4b4}
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffUnsupportedTransportStateTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3ColumnTb4b4b4(Te6edf3horizontalAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterHorizontallyTb4b4b4) Tb4b4b4{
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3IconTb4b4b4(
Te6edf3MeshtasticIconsTb4b4b4.Te6edf3WarningTb4b4b4,
Te6edf3contentDescription Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3sizeTb4b4b4(T79c0ff4T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4,
Te6edf3tint Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3onSurfaceVariantTb4b4b4,
Tb4b4b4)
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3TextTb4b4b4(
Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_update_unsupported_transportTb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3bodyLargeTb4b4b4,
Te6edf3color Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3onSurfaceVariantTb4b4b4,
Te6edf3textAlign Tff7b72= Te6edf3TextAlignTb4b4b4.Te6edf3CenterTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tf0883e@Composable
Tff7b72internal Tff7b72fun Td2a8ffDisclaimerDialogTb4b4b4(
Te6edf3updateMethodTb4b4b4: Te6edf3FirmwareUpdateMethodTb4b4b4,
Te6edf3onDismissTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3onConfirmTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3wipeDeviceTb4b4b4: Tffa657Boolean Tff7b72= Tff7b72falseTb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3MeshtasticDialogTb4b4b4(
Te6edf3onDismiss Tff7b72= Te6edf3onDismissTb4b4b4,
Te6edf3title Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_update_disclaimer_titleTb4b4b4)Tb4b4b4,
Te6edf3confirmText Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3i_know_what_i_m_doingTb4b4b4)Tb4b4b4,
Te6edf3onConfirm Tff7b72= Te6edf3onConfirmTb4b4b4,
Te6edf3dismissText Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3cancelTb4b4b4)Tb4b4b4,
Te6edf3text Tff7b72= Tb4b4b4{
Te6edf3ColumnTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3animateContentSizeTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3horizontalAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterHorizontallyTb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_update_disclaimer_textTb4b4b4)Tb4b4b4)
Te6edf3SpacerTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3RowTb4b4b4(Te6edf3verticalAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterVerticallyTb4b4b4) Tb4b4b4{
Te6edf3IconTb4b4b4(
Te6edf3MeshtasticIconsTb4b4b4.Te6edf3WarningTb4b4b4,
Te6edf3contentDescription Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3tint Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3errorTb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3sizeTb4b4b4(T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3widthTb4b4b4(T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3TextTb4b4b4(
Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_update_disconnect_warningTb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3labelMediumTb4b4b4,
Te6edf3color Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3errorTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3wipeDeviceTb4b4b4) Tb4b4b4{
Te6edf3SpacerTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3RowTb4b4b4(Te6edf3verticalAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterVerticallyTb4b4b4) Tb4b4b4{
Te6edf3IconTb4b4b4(
Te6edf3MeshtasticIconsTb4b4b4.Te6edf3WarningTb4b4b4,
Te6edf3contentDescription Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3tint Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3errorTb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3sizeTb4b4b4(T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3widthTb4b4b4(T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3TextTb4b4b4(
Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_update_wipe_confirm_warningTb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3labelMediumTb4b4b4,
Te6edf3color Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3errorTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3updateMethod Tff7b72is Te6edf3FirmwareUpdateMethodTb4b4b4.Te6edf3BleTb4b4b4) Tb4b4b4{
Te6edf3SpacerTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff1T79c0ff2.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3ChirpyCardTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
T8b949e/** The Ready state's primary action: pick a local file, or start the release update over the active transport. */
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffReadyActionButtonTb4b4b4(
Te6edf3stateTb4b4b4: Te6edf3FirmwareUpdateStateTb4b4b4.Te6edf3ReadyTb4b4b4,
Te6edf3selectedReleaseTypeTb4b4b4: Te6edf3FirmwareReleaseTypeTb4b4b4,
Te6edf3onClickTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3stateTb4b4b4.Te6edf3updateMethod Tff7b72is Te6edf3FirmwareUpdateMethodTb4b4b4.Te6edf3UnknownTb4b4b4) Tff7b72return
Tff7b72if Tb4b4b4(Te6edf3selectedReleaseType Tff7b72!Tff7b72= Te6edf3FirmwareReleaseTypeTb4b4b4.Te6edf3LOCAL Tff7b72&Tff7b72& Te6edf3stateTb4b4b4.Te6edf3release Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tff7b72return
Tff7b72val Te6edf3largeHeight Tff7b72= Te6edf3ButtonDefaultsTb4b4b4.Te6edf3LargeContainerHeight
Te6edf3Column Tb4b4b4{
Te6edf3ButtonTb4b4b4(
Te6edf3onClick Tff7b72= Te6edf3onClickTb4b4b4,
Te6edf3shapes Tff7b72= Te6edf3ButtonDefaultsTb4b4b4.Te6edf3shapesForTb4b4b4(Te6edf3largeHeightTb4b4b4)Tb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3heightTb4b4b4(Te6edf3largeHeightTb4b4b4)Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3selectedReleaseType Tff7b72=Tff7b72= Te6edf3FirmwareReleaseTypeTb4b4b4.Te6edf3LOCALTb4b4b4) Tb4b4b4{
Te6edf3IconTb4b4b4(Te6edf3MeshtasticIconsTb4b4b4.Te6edf3FolderTb4b4b4, Te6edf3contentDescription Tff7b72= Tff7b72nullTb4b4b4)
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3widthTb4b4b4(T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3TextTb4b4b4(
Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_update_select_fileTb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3ButtonDefaultsTb4b4b4.Te6edf3textStyleForTb4b4b4(Te6edf3largeHeightTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3IconTb4b4b4(
Te6edf3imageVector Tff7b72=
Tff7b72when Tb4b4b4(Te6edf3stateTb4b4b4.Te6edf3updateMethodTb4b4b4) Tb4b4b4{
Te6edf3FirmwareUpdateMethodTb4b4b4.Te6edf3Ble Tff7b72-Tff7b72> Te6edf3MeshtasticIconsTb4b4b4.Te6edf3Bluetooth
Te6edf3FirmwareUpdateMethodTb4b4b4.Te6edf3Usb Tff7b72-Tff7b72> Te6edf3MeshtasticIconsTb4b4b4.Te6edf3Usb
Te6edf3FirmwareUpdateMethodTb4b4b4.Te6edf3Wifi Tff7b72-Tff7b72> Te6edf3MeshtasticIconsTb4b4b4.Te6edf3Wifi
Tb4b4b4}Tb4b4b4,
Te6edf3contentDescription Tff7b72= Tff7b72nullTb4b4b4,
Tb4b4b4)
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3widthTb4b4b4(T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3TextTb4b4b4(
Tff7b72if Tb4b4b4(Te6edf3stateTb4b4b4.Te6edf3isRecoveryTb4b4b4) Tb4b4b4{
Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_recovery_buttonTb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3stringResourceTb4b4b4(
Te6edf3resource Tff7b72= Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_update_method_detailTb4b4b4,
Te6edf3stringResourceTb4b4b4(Te6edf3stateTb4b4b4.Te6edf3updateMethodTb4b4b4.Te6edf3descriptionTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3ButtonDefaultsTb4b4b4.Te6edf3textStyleForTb4b4b4(Te6edf3largeHeightTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3selectedReleaseType Tff7b72!Tff7b72= Te6edf3FirmwareReleaseTypeTb4b4b4.Te6edf3LOCAL Tff7b72&Tff7b72& Te6edf3stateTb4b4b4.Te6edf3release Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff2T79c0ff4.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3ReleaseNotesCardTb4b4b4(Te6edf3stateTb4b4b4.Te6edf3releaseTb4b4b4.Te6edf3releaseNotesTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
T8b949e/** Whether the wipe opt-in is shown for this Ready state, and the reason it is disabled when it is. */
Tff7b72internal Tff7b72data Tff7b72class T56d364WipeOfferTb4b4b4(Tff7b72val Te6edf3offeredTb4b4b4: Tffa657BooleanTb4b4b4, Tff7b72val Te6edf3refusalTb4b4b4: Te6edf3UsbMaintenanceRefusal? Tff7b72= Tff7b72nullTb4b4b4)
T8b949e/**
* A wipe can only be offered where a mechanism exists for it: the vetted UF2 erase sequence over USB, or a
* post-verification factory reset over BLE/WiFi. Local files and recovery flows never wipe.
*/
Tff7b72internal Tff7b72fun Td2a8ffwipeOfferTb4b4b4(Te6edf3stateTb4b4b4: Te6edf3FirmwareUpdateStateTb4b4b4.Te6edf3ReadyTb4b4b4, Te6edf3selectedReleaseTypeTb4b4b4: Te6edf3FirmwareReleaseTypeTb4b4b4)Tb4b4b4: Te6edf3WipeOffer Tb4b4b4{
Tff7b72val Te6edf3offered Tff7b72=
Te6edf3selectedReleaseType Tff7b72!Tff7b72= Te6edf3FirmwareReleaseTypeTb4b4b4.Te6edf3LOCAL Tff7b72&Tff7b72&
Te6edf3stateTb4b4b4.Te6edf3release Tff7b72!Tff7b72= Tff7b72null Tff7b72&Tff7b72&
Tff7b72!Te6edf3stateTb4b4b4.Te6edf3isRecovery Tff7b72&Tff7b72&
Tff7b72when Tb4b4b4(Te6edf3stateTb4b4b4.Te6edf3updateMethodTb4b4b4) Tb4b4b4{
Te6edf3FirmwareUpdateMethodTb4b4b4.Te6edf3Usb Tff7b72-Tff7b72> Te6edf3stateTb4b4b4.Te6edf3maintenanceTb4b4b4.Te6edf3show
Te6edf3FirmwareUpdateMethodTb4b4b4.Te6edf3BleTb4b4b4,
Te6edf3FirmwareUpdateMethodTb4b4b4.Te6edf3WifiTb4b4b4,
Tff7b72-Tff7b72> Tff7b72true
Te6edf3FirmwareUpdateMethodTb4b4b4.Te6edf3Unknown Tff7b72-Tff7b72> Tff7b72false
Tb4b4b4}
Tff7b72val Te6edf3refusal Tff7b72= Te6edf3stateTb4b4b4.Te6edf3maintenanceTb4b4b4.Te6edf3eraseRefusalTb4b4b4.Te6edf3takeIf Tb4b4b4{ Te6edf3stateTb4b4b4.Te6edf3updateMethod Tff7b72is Te6edf3FirmwareUpdateMethodTb4b4b4.Te6edf3Usb Tb4b4b4}
Tff7b72return Te6edf3WipeOfferTb4b4b4(Te6edf3offered Tff7b72= Te6edf3offeredTb4b4b4, Te6edf3refusal Tff7b72= Te6edf3refusalTb4b4b4)
Tb4b4b4}
T8b949e/**
* Per-update opt-in for wiping the device as part of the update — always off by default.
*
* Over USB this is a true flash erase (the vetted UF2 maintenance sequence, which reinstalls the selected release
* afterwards); over BLE/WiFi it is a factory reset issued only after the update is verified. A USB erase the gate
* refuses stays **visible but disabled with its reason shown**, because the reason is the useful part — it tells the
* user this app can't confirm their device's SoftDevice and points them at the web flasher.
*/
Tf0883e@Composable
Tff7b72internal Tff7b72fun Td2a8ffWipeDeviceToggleTb4b4b4(
Te6edf3updateMethodTb4b4b4: Te6edf3FirmwareUpdateMethodTb4b4b4,
Te6edf3refusalTb4b4b4: Te6edf3UsbMaintenanceRefusal?Tb4b4b4,
Te6edf3wipeDeviceTb4b4b4: Tffa657BooleanTb4b4b4,
Te6edf3onWipeDeviceChangeTb4b4b4: Tb4b4b4(Tffa657BooleanTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3enabled Tff7b72= Te6edf3refusal Tff7b72=Tff7b72= Tff7b72null
Te6edf3CardTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3ColumnTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3RowTb4b4b4(Te6edf3verticalAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterVerticallyTb4b4b4) Tb4b4b4{
Te6edf3ColumnTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3weightTb4b4b4(T79c0ff1fTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_update_wipe_labelTb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3bodyLargeTb4b4b4,
Tb4b4b4)
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72=
Tff7b72when Tb4b4b4(Te6edf3updateMethodTb4b4b4) Tb4b4b4{
Te6edf3FirmwareUpdateMethodTb4b4b4.Te6edf3Usb Tff7b72-Tff7b72> Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_update_wipe_usb_detailTb4b4b4)
Tff7b72else Tff7b72-Tff7b72> Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_update_wipe_ble_detailTb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3bodySmallTb4b4b4,
Te6edf3color Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3onSurfaceVariantTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3widthTb4b4b4(T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3SwitchTb4b4b4(Te6edf3checked Tff7b72= Te6edf3wipeDevice Tff7b72&Tff7b72& Te6edf3enabledTb4b4b4, Te6edf3onCheckedChange Tff7b72= Te6edf3onWipeDeviceChangeTb4b4b4, Te6edf3enabled Tff7b72= Te6edf3enabledTb4b4b4)
Tb4b4b4}
Te6edf3refusalTff7b72?.Te6edf3let Tb4b4b4{
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff4.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3usbMaintenanceRefusalTextTb4b4b4(Tffa657itTb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3bodySmallTb4b4b4,
Te6edf3color Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3onSurfaceVariantTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffChirpyCardTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3CardTb4b4b4(
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3paddingTb4b4b4(T79c0ff4.Te6edf3dpTb4b4b4)Tb4b4b4,
Te6edf3colors Tff7b72= Te6edf3CardDefaultsTb4b4b4.Te6edf3cardColorsTb4b4b4(Te6edf3containerColor Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3surfaceVariantTb4b4b4)Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3ColumnTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3paddingTb4b4b4(T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4, Te6edf3horizontalAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterHorizontallyTb4b4b4) Tb4b4b4{
Te6edf3RowTb4b4b4(
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4,
Te6edf3verticalAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3BottomTb4b4b4,
Te6edf3horizontalArrangement Tff7b72= Te6edf3spacedByTb4b4b4(T79c0ff4.Te6edf3dpTb4b4b4)Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(Te6edf3text Tff7b72= Ta5d6ff"Ta5d6ff🪜Ta5d6ff"Tb4b4b4, Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3sizeTb4b4b4(T79c0ff4T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4, Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3headlineLargeTb4b4b4)
Te6edf3ImageTb4b4b4(
Te6edf3painter Tff7b72= Te6edf3painterResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3drawableTb4b4b4.Te6edf3img_chirpyTb4b4b4)Tb4b4b4,
Te6edf3contentScale Tff7b72= Te6edf3ContentScaleTb4b4b4.Te6edf3FitTb4b4b4,
Te6edf3contentDescription Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3chirpyTb4b4b4)Tb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3sizeTb4b4b4(T79c0ff4T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_update_disclaimer_chirpy_saysTb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3labelSmallTb4b4b4,
Te6edf3textAlign Tff7b72= Te6edf3TextAlignTb4b4b4.Te6edf3CenterTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffDeviceHardwareImageTb4b4b4(Te6edf3deviceHardwareTb4b4b4: Te6edf3DeviceHardwareTb4b4b4, Te6edf3modifierTb4b4b4: Te6edf3Modifier Tff7b72= Te6edf3ModifierTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3hwImg Tff7b72= Te6edf3deviceHardwareTb4b4b4.Te6edf3imagesTff7b72?.Te6edf3getOrNullTb4b4b4(T79c0ff1Tb4b4b4) Tff7b72?: Te6edf3deviceHardwareTb4b4b4.Te6edf3imagesTff7b72?.Te6edf3getOrNullTb4b4b4(T79c0ff0Tb4b4b4) Tff7b72?: Ta5d6ff"Ta5d6ffunknown.svgTa5d6ff"
Tff7b72val Te6edf3imageUrl Tff7b72= Ta5d6ff"Ta5d6ffhttps://flasher.meshtastic.org/img/devices/Tffd700$Te6edf3hwImgTa5d6ff"
Tff7b72val Te6edf3fallbackPainter Tff7b72= Te6edf3painterResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3drawableTb4b4b4.Te6edf3img_hw_unknownTb4b4b4)
Te6edf3AsyncImageTb4b4b4(
Te6edf3model Tff7b72= Te6edf3ImageRequestTb4b4b4.Te6edf3BuilderTb4b4b4(Te6edf3LocalPlatformContextTb4b4b4.Te6edf3currentTb4b4b4)Tb4b4b4.Te6edf3dataTb4b4b4(Te6edf3imageUrlTb4b4b4)Tb4b4b4.Te6edf3crossfadeTb4b4b4(Tff7b72trueTb4b4b4)Tb4b4b4.Te6edf3buildTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3contentScale Tff7b72= Te6edf3ContentScaleTb4b4b4.Te6edf3FitTb4b4b4,
Te6edf3contentDescription Tff7b72= Te6edf3deviceHardwareTb4b4b4.Te6edf3displayNameTb4b4b4,
Te6edf3placeholder Tff7b72= Te6edf3fallbackPainterTb4b4b4,
Te6edf3error Tff7b72= Te6edf3fallbackPainterTb4b4b4,
Te6edf3fallback Tff7b72= Te6edf3fallbackPainterTb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3modifierTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffReleaseNotesCardTb4b4b4(Te6edf3releaseNotesTb4b4b4: Tffa657StringTb4b4b4) Tb4b4b4{
Te6edf3ElevatedCardTb4b4b4(
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3animateContentSizeTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3colors Tff7b72= Te6edf3CardDefaultsTb4b4b4.Te6edf3elevatedCardColorsTb4b4b4(Te6edf3containerColor Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3surfaceTb4b4b4)Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3ColumnTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_update_release_notesTb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3titleMediumTb4b4b4,
Tb4b4b4)
Te6edf3SpacerTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff1T79c0ff2.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3MarkdownTb4b4b4(Te6edf3content Tff7b72= Te6edf3releaseNotesTb4b4b4, Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffDeviceInfoCardTb4b4b4(
Te6edf3deviceHardwareTb4b4b4: Te6edf3DeviceHardwareTb4b4b4,
Te6edf3releaseTb4b4b4: Te6edf3FirmwareRelease?Tb4b4b4,
Te6edf3currentFirmwareVersionTb4b4b4: Tffa657String? Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3selectedReleaseTypeTb4b4b4: Te6edf3FirmwareReleaseType Tff7b72= Te6edf3FirmwareReleaseTypeTb4b4b4.Te6edf3STABLETb4b4b4,
Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3target Tff7b72= Te6edf3deviceHardwareTb4b4b4.Te6edf3hwModelSlugTb4b4b4.Te6edf3ifEmpty Tb4b4b4{ Te6edf3deviceHardwareTb4b4b4.Te6edf3platformioTarget Tb4b4b4}
Te6edf3ElevatedCardTb4b4b4(
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3animateContentSizeTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3colors Tff7b72= Te6edf3CardDefaultsTb4b4b4.Te6edf3elevatedCardColorsTb4b4b4(Te6edf3containerColor Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3surfaceContainerLowTb4b4b4)Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3ColumnTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(T79c0ff2T79c0ff4.Te6edf3dpTb4b4b4)Tb4b4b4, Te6edf3horizontalAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterHorizontallyTb4b4b4) Tb4b4b4{
Te6edf3RowTb4b4b4(
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3horizontalArrangement Tff7b72= Te6edf3ArrangementTb4b4b4.Te6edf3SpaceBetweenTb4b4b4,
Te6edf3verticalAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterVerticallyTb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3DeviceHardwareImageTb4b4b4(Te6edf3deviceHardwareTb4b4b4, Te6edf3ModifierTb4b4b4.Te6edf3sizeTb4b4b4(T79c0ff8T79c0ff0.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3TextTb4b4b4(
Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_update_deviceTb4b4b4, Te6edf3deviceHardwareTb4b4b4.Te6edf3displayNameTb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3headlineSmallTb4b4b4,
Te6edf3textAlign Tff7b72= Te6edf3TextAlignTb4b4b4.Te6edf3CenterTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3TextTb4b4b4(
Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_update_targetTb4b4b4, Te6edf3targetTb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3bodyMediumTb4b4b4,
Te6edf3color Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3onSurfaceVariantTb4b4b4,
Tb4b4b4)
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff4.Te6edf3dpTb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3currentVersionString Tff7b72=
Te6edf3stringResourceTb4b4b4(
Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_update_currently_installedTb4b4b4,
Te6edf3currentFirmwareVersionTff7b72?.Te6edf3takeIf Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3isNotBlankTb4b4b4(Tb4b4b4) Tb4b4b4}
Tff7b72?: Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_update_unknown_releaseTb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3TextTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3text Tff7b72= Te6edf3currentVersionStringTb4b4b4)
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff4.Te6edf3dpTb4b4b4)Tb4b4b4)
Tff7b72val Tb4b4b4(Te6edf3labelTb4b4b4, Te6edf3versionTb4b4b4) Tff7b72=
Tff7b72if Tb4b4b4(Te6edf3selectedReleaseType Tff7b72=Tff7b72= Te6edf3FirmwareReleaseTypeTb4b4b4.Te6edf3LOCALTb4b4b4) Tb4b4b4{
Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_update_source_localTb4b4b4) Te6edf3to Ta5d6ff"Ta5d6ff"
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72val Te6edf3releaseVersion Tff7b72= Te6edf3releaseTff7b72?.Te6edf3title Tff7b72?: Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_update_unknown_releaseTb4b4b4)
Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_update_latestTb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4) Te6edf3to Te6edf3releaseVersion
Tb4b4b4}
Te6edf3TextTb4b4b4(
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3text Tff7b72= Ta5d6ff"Tffd700$Te6edf3labelTffd700$Te6edf3versionTa5d6ff"Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3bodyLargeTb4b4b4,
Te6edf3color Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3primaryTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
T8b949e/**
* Offers the OTAFIX bootloader upgrade where an image exists for the device's Board-ID.
*
* Destructive, so it sits behind a confirmation and is rendered as a low-emphasis text button rather than anything that
* competes with the primary update action — the same treatment [BootloaderWarningCard] uses. Factory erase is not
* offered here: it lives on the update action itself as the [WipeDeviceToggle] opt-in, so an erase always ends with a
* release installed. A missing bootloader image hides the card — that is a coverage gap, not something a user can act
* on.
*/
Tf0883e@Composable
Tff7b72internal Tff7b72fun Td2a8ffUsbMaintenanceCardTb4b4b4(Te6edf3deviceNameTb4b4b4: Tffa657StringTb4b4b4, Te6edf3onBootloaderUpgradeTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4) Tb4b4b4{
Tff7b72var Te6edf3showUpgradeConfirmation Tff7b72by Te6edf3rememberSaveable Tb4b4b4{ Te6edf3mutableStateOfTb4b4b4(Tff7b72falseTb4b4b4) Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3showUpgradeConfirmationTb4b4b4) Tb4b4b4{
Te6edf3MeshtasticDialogTb4b4b4(
Te6edf3onDismiss Tff7b72= Tb4b4b4{ Te6edf3showUpgradeConfirmation Tff7b72= Tff7b72false Tb4b4b4}Tb4b4b4,
Te6edf3title Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_maintenance_upgrade_confirm_titleTb4b4b4)Tb4b4b4,
Te6edf3message Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_maintenance_upgrade_confirm_textTb4b4b4, Te6edf3deviceNameTb4b4b4)Tb4b4b4,
Te6edf3confirmText Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_maintenance_upgrade_bootloader_actionTb4b4b4)Tb4b4b4,
Te6edf3onConfirm Tff7b72= Tb4b4b4{
Te6edf3showUpgradeConfirmation Tff7b72= Tff7b72false
Te6edf3onBootloaderUpgradeTb4b4b4(Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3dismissText Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3cancelTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Te6edf3CardTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3animateContentSizeTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3ColumnTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3TextButtonTb4b4b4(Te6edf3onClick Tff7b72= Tb4b4b4{ Te6edf3showUpgradeConfirmation Tff7b72= Tff7b72true Tb4b4b4}Tb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_maintenance_upgrade_bootloader_actionTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
T8b949e/**
* Copy for a pre-flight refusal shown inline next to the disabled button.
*
* Resolves the same [usbMaintenanceRefusalMessage] mapping the ViewModel uses for a refusal raised mid-flow, so the two
* call sites can never drift out of sync with each other.
*/
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffusbMaintenanceRefusalTextTb4b4b4(Te6edf3refusalTb4b4b4: Te6edf3UsbMaintenanceRefusalTb4b4b4)Tb4b4b4: Tffa657String Tff7b72=
Te6edf3usbMaintenanceRefusalMessageTb4b4b4(Te6edf3refusalTb4b4b4)Tb4b4b4.Te6edf3asStringTb4b4b4(Tb4b4b4)
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffBootloaderWarningCardTb4b4b4(Te6edf3deviceHardwareTb4b4b4: Te6edf3DeviceHardwareTb4b4b4, Te6edf3onDismissForDeviceTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3openUrl Tff7b72= Te6edf3rememberOpenUrlTb4b4b4(Tb4b4b4)
Te6edf3ElevatedCardTb4b4b4(
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3animateContentSizeTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3colors Tff7b72=
Te6edf3CardDefaultsTb4b4b4.Te6edf3elevatedCardColorsTb4b4b4(
Te6edf3containerColor Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3errorContainerTb4b4b4,
Te6edf3contentColor Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3onErrorContainerTb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3ColumnTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3RowTb4b4b4(Te6edf3verticalAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterVerticallyTb4b4b4) Tb4b4b4{
Te6edf3IconTb4b4b4(
Te6edf3imageVector Tff7b72= Te6edf3MeshtasticIconsTb4b4b4.Te6edf3WarningTb4b4b4,
Te6edf3contentDescription Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3tint Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3onErrorContainerTb4b4b4,
Tb4b4b4)
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3widthTb4b4b4(T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72=
Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_update_usb_bootloader_warningTb4b4b4, Te6edf3deviceHardwareTb4b4b4.Te6edf3displayNameTb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3bodyMediumTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tff7b72val Te6edf3slug Tff7b72= Te6edf3deviceHardwareTb4b4b4.Te6edf3hwModelSlug
Tff7b72if Tb4b4b4(Te6edf3slugTb4b4b4.Te6edf3equalsTb4b4b4(Ta5d6ff"Ta5d6ffRAK4631Ta5d6ff"Tb4b4b4, Te6edf3ignoreCase Tff7b72= Tff7b72trueTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff4.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_update_rak4631_bootloader_hintTb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3bodySmallTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tff7b72val Te6edf3infoUrl Tff7b72= Te6edf3deviceHardwareTb4b4b4.Te6edf3bootloaderInfoUrl
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3infoUrlTb4b4b4.Te6edf3isNullOrEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3TextButtonTb4b4b4(Te6edf3onClick Tff7b72= Tb4b4b4{ Te6edf3openUrlTb4b4b4(Te6edf3infoUrlTb4b4b4) Tb4b4b4}Tb4b4b4) Tb4b4b4{ Te6edf3TextTb4b4b4(Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3learn_moreTb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3TextButtonTb4b4b4(Te6edf3onClick Tff7b72= Te6edf3onDismissForDeviceTb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3dont_show_again_for_deviceTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffReleaseTypeSelectorTb4b4b4(
Te6edf3selectedReleaseTypeTb4b4b4: Te6edf3FirmwareReleaseTypeTb4b4b4,
Te6edf3showNightlyTb4b4b4: Tffa657BooleanTb4b4b4,
Te6edf3onReleaseTypeSelectTb4b4b4: Tb4b4b4(Te6edf3FirmwareReleaseTypeTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3types Tff7b72= Te6edf3buildList Tb4b4b4{
Te6edf3addTb4b4b4(Te6edf3FirmwareReleaseTypeTb4b4b4.Te6edf3STABLE Te6edf3to Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_update_stableTb4b4b4)
Te6edf3addTb4b4b4(Te6edf3FirmwareReleaseTypeTb4b4b4.Te6edf3ALPHA Te6edf3to Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_update_alphaTb4b4b4)
T8b949e// Hidden behind the hidden-features unlock, mirroring the web flasher's konami-gated nightly.
Tff7b72if Tb4b4b4(Te6edf3showNightlyTb4b4b4) Te6edf3addTb4b4b4(Te6edf3FirmwareReleaseTypeTb4b4b4.Te6edf3NIGHTLY Te6edf3to Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_update_nightlyTb4b4b4)
Te6edf3addTb4b4b4(Te6edf3FirmwareReleaseTypeTb4b4b4.Te6edf3LOCAL Te6edf3to Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_update_local_fileTb4b4b4)
Tb4b4b4}
Te6edf3SingleChoiceSegmentedButtonRowTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3typesTb4b4b4.Te6edf3forEachIndexed Tb4b4b4{ Te6edf3indexTb4b4b4, Tb4b4b4(Te6edf3typeTb4b4b4, Te6edf3labelTb4b4b4) Tff7b72-Tff7b72>
Te6edf3SegmentedButtonTb4b4b4(
Te6edf3selected Tff7b72= Te6edf3selectedReleaseType Tff7b72=Tff7b72= Te6edf3typeTb4b4b4,
Te6edf3onClick Tff7b72= Tb4b4b4{ Te6edf3onReleaseTypeSelectTb4b4b4(Te6edf3typeTb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3shape Tff7b72= Te6edf3SegmentedButtonDefaultsTb4b4b4.Te6edf3itemShapeTb4b4b4(Te6edf3index Tff7b72= Te6edf3indexTb4b4b4, Te6edf3count Tff7b72= Te6edf3typesTb4b4b4.Te6edf3sizeTb4b4b4)Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(Te6edf3stringResourceTb4b4b4(Te6edf3labelTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffProgressContentTb4b4b4(
Te6edf3progressStateTb4b4b4: Te6edf3ProgressStateTb4b4b4,
Te6edf3onCancelTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3isDownloadingTb4b4b4: Tffa657Boolean Tff7b72= Tff7b72falseTb4b4b4,
Te6edf3isUpdatingTb4b4b4: Tffa657Boolean Tff7b72= Tff7b72falseTb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3ColumnTb4b4b4(
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3horizontalAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterHorizontallyTb4b4b4,
Te6edf3verticalArrangement Tff7b72= Te6edf3ArrangementTb4b4b4.Te6edf3TopTb4b4b4,
Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3isDownloadingTb4b4b4) Tb4b4b4{
Te6edf3IconTb4b4b4(
Te6edf3MeshtasticIconsTb4b4b4.Te6edf3CloudDownloadTb4b4b4,
Te6edf3contentDescription Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3sizeTb4b4b4(T79c0ff4T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4,
Te6edf3tint Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3primaryTb4b4b4,
Tb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Tf0883e@OptInTb4b4b4(Te6edf3ExperimentalMaterial3ExpressiveApiTff7b72::Te6edf3classTb4b4b4)
Te6edf3CircularWavyProgressIndicatorTb4b4b4(
Te6edf3progress Tff7b72= Tb4b4b4{ Tff7b72if Tb4b4b4(Te6edf3isUpdatingTb4b4b4) Te6edf3progressStateTb4b4b4.Te6edf3progress Tff7b72else T79c0ff1f Tb4b4b4}Tb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3sizeTb4b4b4(T79c0ff6T79c0ff4.Te6edf3dpTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff2T79c0ff4.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3TextTb4b4b4(
Te6edf3progressStateTb4b4b4.Te6edf3messageTb4b4b4.Te6edf3asStringTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3titleMediumTb4b4b4,
Te6edf3textAlign Tff7b72= Te6edf3TextAlignTb4b4b4.Te6edf3CenterTb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3details Tff7b72= Te6edf3progressStateTb4b4b4.Te6edf3details
Tff7b72if Tb4b4b4(Te6edf3details Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff4.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3detailsTb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3bodySmallTb4b4b4,
Te6edf3color Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3onSurfaceVariantTb4b4b4,
Te6edf3textAlign Tff7b72= Te6edf3TextAlignTb4b4b4.Te6edf3CenterTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tff7b72val Te6edf3hint Tff7b72= Te6edf3progressStateTb4b4b4.Te6edf3hint
Tff7b72if Tb4b4b4(Te6edf3hint Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3hintTb4b4b4.Te6edf3asStringTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3bodySmallTb4b4b4,
Te6edf3color Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3primaryTb4b4b4,
Te6edf3textAlign Tff7b72= Te6edf3TextAlignTb4b4b4.Te6edf3CenterTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff1T79c0ff2.Te6edf3dpTb4b4b4)Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3isDownloading Tff7b72|Tff7b72| Te6edf3isUpdatingTb4b4b4) Tb4b4b4{
Tf0883e@OptInTb4b4b4(Te6edf3ExperimentalMaterial3ExpressiveApiTff7b72::Te6edf3classTb4b4b4)
Te6edf3LinearWavyProgressIndicatorTb4b4b4(
Te6edf3progress Tff7b72= Tb4b4b4{ Te6edf3progressStateTb4b4b4.Te6edf3progress Tb4b4b4}Tb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3horizontal Tff7b72= T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3CyclingMessagesTb4b4b4(Tb4b4b4)
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff2T79c0ff4.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3OutlinedButtonTb4b4b4(Te6edf3onClick Tff7b72= Te6edf3onCancelTb4b4b4) Tb4b4b4{ Te6edf3TextTb4b4b4(Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3cancelTb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tf0883e@Composable
Tff7b72internal Tff7b72fun Td2a8ffAwaitingFileSaveStateTb4b4b4(
Te6edf3stateTb4b4b4: Te6edf3FirmwareUpdateStateTb4b4b4.Te6edf3AwaitingFileSaveTb4b4b4,
Te6edf3onSaveFileTb4b4b4: Tb4b4b4(Tffa657StringTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3onPickVolumeTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Tb4b4b4) Tb4b4b4{
T8b949e// Keyed on the step so each leg of a multi-pass sequence re-shows its own instructions. An unkeyed remember would
T8b949e// leave the second pass with no dialog at all, since the branch stays in composition across the transition.
Tff7b72var Te6edf3showDialog Tff7b72by Te6edf3rememberSaveableTb4b4b4(Te6edf3stateTb4b4b4.Te6edf3stepTb4b4b4) Tb4b4b4{ Te6edf3mutableStateOfTb4b4b4(Tff7b72trueTb4b4b4) Tb4b4b4}
T8b949e// A maintenance pass has no artifact yet: the image is chosen from what the volume reports, so the user points at
T8b949e// the drive and the app names the file.
Tff7b72val Te6edf3fileName Tff7b72= Te6edf3stateTb4b4b4.Te6edf3fileName
Tff7b72val Te6edf3launchPicker Tff7b72= Tb4b4b4{ Tff7b72if Tb4b4b4(Te6edf3fileName Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Te6edf3onSaveFileTb4b4b4(Te6edf3fileNameTb4b4b4) Tff7b72else Te6edf3onPickVolumeTb4b4b4(Tb4b4b4) Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3showDialogTb4b4b4) Tb4b4b4{
Te6edf3MeshtasticDialogTb4b4b4(
Te6edf3onDismiss Tff7b72= Tb4b4b4{ T8b949e/* No-op to force user to acknowledge */ Tb4b4b4}Tb4b4b4,
Te6edf3title Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_update_usb_instruction_titleTb4b4b4)Tb4b4b4,
Te6edf3confirmText Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3okayTb4b4b4)Tb4b4b4,
Te6edf3onConfirm Tff7b72= Tb4b4b4{
Te6edf3showDialog Tff7b72= Tff7b72false
Te6edf3launchPickerTb4b4b4(Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3text Tff7b72= Tb4b4b4{
Te6edf3TextTb4b4b4(
Tff7b72if Tb4b4b4(Te6edf3fileName Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_update_usb_instruction_textTb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_maintenance_select_driveTb4b4b4)
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3dismissable Tff7b72= Tff7b72falseTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Te6edf3CircularWavyProgressIndicatorTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3sizeTb4b4b4(T79c0ff6T79c0ff4.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff2T79c0ff4.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3TextTb4b4b4(
Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_update_save_dfu_fileTb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3titleMediumTb4b4b4,
Te6edf3textAlign Tff7b72= Te6edf3TextAlignTb4b4b4.Te6edf3CenterTb4b4b4,
Tb4b4b4)
Te6edf3stateTb4b4b4.Te6edf3retryMessageTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3retry Tff7b72-Tff7b72>
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff1T79c0ff2.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3retryTb4b4b4.Te6edf3asStringTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3bodyMediumTb4b4b4,
Te6edf3color Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3errorTb4b4b4,
Te6edf3textAlign Tff7b72= Te6edf3TextAlignTb4b4b4.Te6edf3CenterTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3showDialogTb4b4b4) Tb4b4b4{
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3ButtonTb4b4b4(Te6edf3onClick Tff7b72= Te6edf3launchPickerTb4b4b4) Tb4b4b4{ Te6edf3TextTb4b4b4(Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3saveTb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffCyclingMessagesTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3messages Tff7b72=
Te6edf3listOfTb4b4b4(
Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_update_hang_tightTb4b4b4)Tb4b4b4,
Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_update_keep_device_closeTb4b4b4)Tb4b4b4,
Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_update_do_not_closeTb4b4b4)Tb4b4b4,
Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_update_almost_thereTb4b4b4)Tb4b4b4,
Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_update_taking_a_whileTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72var Te6edf3currentMessageIndex Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3mutableIntStateOfTb4b4b4(T79c0ff0Tb4b4b4) Tb4b4b4}
Te6edf3LaunchedEffectTb4b4b4(Tffa657UnitTb4b4b4) Tb4b4b4{
Tff7b72while Tb4b4b4(Tff7b72trueTb4b4b4) Tb4b4b4{
Te6edf3delayTb4b4b4(Te6edf3CYCLE_DELAY_MSTb4b4b4)
Te6edf3currentMessageIndex Tff7b72= Tb4b4b4(Te6edf3currentMessageIndex Tff7b72+ T79c0ff1Tb4b4b4) Tff7b72% Te6edf3messagesTb4b4b4.Te6edf3size
Tb4b4b4}
Tb4b4b4}
Te6edf3TextTb4b4b4(
Te6edf3messagesTff7b72[Te6edf3currentMessageIndexTff7b72]Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3bodyMediumTb4b4b4,
Te6edf3color Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3onSurfaceVariantTb4b4b4,
Te6edf3textAlign Tff7b72= Te6edf3TextAlignTb4b4b4.Te6edf3CenterTb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3heightTb4b4b4(T79c0ff4T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffVerificationFailedStateTb4b4b4(Te6edf3onRetryTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4, Te6edf3onIgnoreTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4) Tb4b4b4{
Te6edf3IconTb4b4b4(
Te6edf3MeshtasticIconsTb4b4b4.Te6edf3WarningTb4b4b4,
Te6edf3contentDescription Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3sizeTb4b4b4(T79c0ff6T79c0ff4.Te6edf3dpTb4b4b4)Tb4b4b4,
Te6edf3tint Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3errorTb4b4b4,
Tb4b4b4)
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff2T79c0ff4.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3TextTb4b4b4(
Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_update_verification_failedTb4b4b4)Tb4b4b4,
Te6edf3color Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3errorTb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3bodyLargeTb4b4b4,
Te6edf3textAlign Tff7b72= Te6edf3TextAlignTb4b4b4.Te6edf3CenterTb4b4b4,
Tb4b4b4)
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff3T79c0ff2.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3RowTb4b4b4(Te6edf3horizontalArrangement Tff7b72= Te6edf3spacedByTb4b4b4(T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3OutlinedButtonTb4b4b4(Te6edf3onClick Tff7b72= Te6edf3onRetryTb4b4b4) Tb4b4b4{
Te6edf3IconTb4b4b4(Te6edf3MeshtasticIconsTb4b4b4.Te6edf3RefreshTb4b4b4, Te6edf3contentDescription Tff7b72= Tff7b72nullTb4b4b4)
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3widthTb4b4b4(T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3TextTb4b4b4(Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_update_retryTb4b4b4)Tb4b4b4)
Tb4b4b4}
Te6edf3ButtonTb4b4b4(Te6edf3onClick Tff7b72= Te6edf3onIgnoreTb4b4b4) Tb4b4b4{ Te6edf3TextTb4b4b4(Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_update_doneTb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tf0883e@Composable
Tff7b72internal Tff7b72fun Td2a8ffErrorStateTb4b4b4(Te6edf3errorTb4b4b4: Te6edf3UiTextTb4b4b4, Te6edf3onRetryTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4) Tb4b4b4{
Te6edf3IconTb4b4b4(
Te6edf3MeshtasticIconsTb4b4b4.Te6edf3DangerousTb4b4b4,
Te6edf3contentDescription Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3sizeTb4b4b4(T79c0ff6T79c0ff4.Te6edf3dpTb4b4b4)Tb4b4b4,
Te6edf3tint Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3errorTb4b4b4,
Tb4b4b4)
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff2T79c0ff4.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3TextTb4b4b4(
Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_update_errorTb4b4b4, Te6edf3errorTb4b4b4.Te6edf3asStringTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3color Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3errorTb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3bodyLargeTb4b4b4,
Te6edf3textAlign Tff7b72= Te6edf3TextAlignTb4b4b4.Te6edf3CenterTb4b4b4,
Tb4b4b4)
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff3T79c0ff2.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3OutlinedButtonTb4b4b4(Te6edf3onClick Tff7b72= Te6edf3onRetryTb4b4b4) Tb4b4b4{
Te6edf3IconTb4b4b4(Te6edf3MeshtasticIconsTb4b4b4.Te6edf3RefreshTb4b4b4, Te6edf3contentDescription Tff7b72= Tff7b72nullTb4b4b4)
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3widthTb4b4b4(T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3TextTb4b4b4(Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_update_retryTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tf0883e@Composable
Tff7b72internal Tff7b72fun Td2a8ffSuccessStateTb4b4b4(Te6edf3wasLowSpeedTransferTb4b4b4: Tffa657Boolean Tff7b72= Tff7b72falseTb4b4b4, Te6edf3deviceWasWipedTb4b4b4: Tffa657Boolean Tff7b72= Tff7b72falseTb4b4b4, Te6edf3onDoneTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3haptic Tff7b72= Te6edf3LocalHapticFeedbackTb4b4b4.Te6edf3current
Tff7b72val Te6edf3openUrl Tff7b72= Te6edf3rememberOpenUrlTb4b4b4(Tb4b4b4)
Te6edf3LaunchedEffectTb4b4b4(Tffa657UnitTb4b4b4) Tb4b4b4{ Te6edf3hapticTb4b4b4.Te6edf3performHapticFeedbackTb4b4b4(Te6edf3HapticFeedbackTypeTb4b4b4.Te6edf3LongPressTb4b4b4) Tb4b4b4}
Te6edf3ColumnTb4b4b4(Te6edf3horizontalAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterHorizontallyTb4b4b4) Tb4b4b4{
Te6edf3IconTb4b4b4(
Te6edf3MeshtasticIconsTb4b4b4.Te6edf3CheckCircleTb4b4b4,
Te6edf3contentDescription Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3sizeTb4b4b4(T79c0ff1T79c0ff0T79c0ff0.Te6edf3dpTb4b4b4)Tb4b4b4,
Te6edf3tint Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3primaryTb4b4b4,
Tb4b4b4)
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff2T79c0ff4.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3TextTb4b4b4(
Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_update_successTb4b4b4)Tb4b4b4,
Te6edf3color Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3primaryTb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3headlineLargeTb4b4b4,
Te6edf3textAlign Tff7b72= Te6edf3TextAlignTb4b4b4.Te6edf3CenterTb4b4b4,
Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3deviceWasWipedTb4b4b4) Tb4b4b4{
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_update_success_wipedTb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3bodyMediumTb4b4b4,
Te6edf3color Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3onSurfaceVariantTb4b4b4,
Te6edf3textAlign Tff7b72= Te6edf3TextAlignTb4b4b4.Te6edf3CenterTb4b4b4,
Tb4b4b4)
Tb4b4b4}
T8b949e// The just-finished transfer was MTU-capped (stock bootloader). Now that the device is back and it's safe to
T8b949e// leave the app, offer a one-time OTAFIX upgrade tip for faster future updates.
Tff7b72if Tb4b4b4(Te6edf3wasLowSpeedTransferTb4b4b4) Tb4b4b4{
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_update_slow_bootloader_hintTb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3bodyMediumTb4b4b4,
Te6edf3color Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3onSurfaceVariantTb4b4b4,
Te6edf3textAlign Tff7b72= Te6edf3TextAlignTb4b4b4.Te6edf3CenterTb4b4b4,
Tb4b4b4)
Te6edf3TextButtonTb4b4b4(Te6edf3onClick Tff7b72= Tb4b4b4{ Te6edf3openUrlTb4b4b4(Te6edf3OTAFIX_BOOTLOADER_URLTb4b4b4) Tb4b4b4}Tb4b4b4) Tb4b4b4{ Te6edf3TextTb4b4b4(Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3learn_moreTb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff3T79c0ff2.Te6edf3dpTb4b4b4)Tb4b4b4)
Tf0883e@OptInTb4b4b4(Te6edf3ExperimentalMaterial3ExpressiveApiTff7b72::Te6edf3classTb4b4b4)
Tff7b72val Te6edf3largeHeight Tff7b72= Te6edf3ButtonDefaultsTb4b4b4.Te6edf3LargeContainerHeight
Tf0883e@OptInTb4b4b4(Te6edf3ExperimentalMaterial3ExpressiveApiTff7b72::Te6edf3classTb4b4b4)
Te6edf3ButtonTb4b4b4(
Te6edf3onClick Tff7b72= Te6edf3onDoneTb4b4b4,
Te6edf3shapes Tff7b72= Te6edf3ButtonDefaultsTb4b4b4.Te6edf3shapesForTb4b4b4(Te6edf3largeHeightTb4b4b4)Tb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3heightTb4b4b4(Te6edf3largeHeightTb4b4b4)Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3firmware_update_doneTb4b4b4)Tb4b4b4, Te6edf3style Tff7b72= Te6edf3ButtonDefaultsTb4b4b4.Te6edf3textStyleForTb4b4b4(Te6edf3largeHeightTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Served by rngit 1.5.1 - Generated in 0.25s